#ifndef _BYTEFIFO_H_
#define _BYTEFIFO_H_

struct ByteFIFO_struct {
    U16 size;       /// taille maximale des données
    U16 readPtr;    /// numéro de la prochaine case à lire
    U16 writePtr;   /// numéro de la prochaine case à écrire
    U16 dataSize;   /// Taille des données stockées
    U8 data[];      /// données stoquées
};
typedef struct ByteFIFO_struct* ByteFIFO;

typedef enum { 
	ByteFIFO_ok,
	ByteFIFO_full,
	ByteFIFO_notEnoughtData
} ByteFIFO_Error;

inline ByteFIFO ByteFIFO_new(const U16 size);

inline U8 ByteFIFO_isEmpty(const ByteFIFO fifo);
inline U8 ByteFIFO_isFull(const ByteFIFO fifo);
inline U16 ByteFIFO_getDataSize(const ByteFIFO fifo);
inline U16 ByteFIFO_getAvailableSize(const ByteFIFO fifo);

inline void ByteFIFO_clear(ByteFIFO fifo);
inline void ByteFIFO_free(ByteFIFO fifo);

inline U8 ByteFIFO_get(const ByteFIFO fifo);
inline U8 ByteFIFO_pop(ByteFIFO fifo);
inline ByteFIFO_Error ByteFIFO_push(ByteFIFO fifo, const U8 data);
inline ByteFIFO_Error ByteFIFO_pushBlock(ByteFIFO fifo, const U16 size, const void* data);
inline ByteFIFO_Error ByteFIFO_popBlock(ByteFIFO fifo, const U16 size, void* data);

#endif // _BYTEFIFO_H_
